#ifndef CANVAS_H
#define CANVAS_H

#include "QWidget"
#include "QPixmap"
#include <QVBoxLayout>
#include "QMouseEvent"
#include <QLabel>
#include <QRgb>
#include "include/ToolBoxView.h"

#include <vector>
#include "include/BrushTool.h"

using namespace std;

/*! ***************************************
 *  @brief  Le Canvas a pour seul objectif celui d'afficher les images en provenance de AtlasManager en fonction de la valeur de zoom
 *            et de la "position" du coin supérieur droit du Canvas
 *******************************************/

class Canvas :   public  QWidget
{
    Q_OBJECT

    /**********************************
     *          Public
     **********************************/
    public :

        /**********************************
         *          Constructors
         **********************************/


            /*! @brief Charge une image à l'intérieur du nouveau Canvas */
            Canvas( string filePath, QWidget *parent);

            /*! @brief Crée un nouveau canvas aux dimensions spécifiés  */
            Canvas( int width, int height, QWidget *parent);

            void Initialize();

        /**********************************
         *          Methods
         **********************************/

            ToolBoxView & GetToolBoxView();
            void ResizeImage(int x, int y);
            void SaveImage(string filePath);
            void LoadImage(string filePath);

            /**********************************
             *          Get
             **********************************/

                int     Width();
                int     Height();

                QColor Pixel(int x, int y);

            /**********************************
             *          Set
             **********************************/

                void Pixel(int x, int y,QColor & color);

        /**********************************
         *          Events
         **********************************/

            void resizeEvent(QResizeEvent * resize);
            void mouseMoveEvent(QMouseEvent * mouseEvent);
            void mouseReleaseEvent(QMouseEvent * mouseEvent);
            void wheelEvent(QWheelEvent * wheelEvent);

        /**********************************
         *          Properties
         **********************************/

    /**********************************
     *          Protected
     **********************************/
    protected:
        /**********************************
         *          Methods
         **********************************/

            /**********************************
             *          Virtual
             **********************************/

                virtual void SetToolBox();

        /**********************************
         *          Properties
         **********************************/

    /**********************************
     *          Private
     **********************************/
    private:

        /**********************************
         *          Methods
         **********************************/

            // Positionne la zone d'affichage en fonction du zoom et décallage
            void SetCanvas();

        /**********************************
         *          Properties
         **********************************/

            QImage*         m_Image;
            QLabel*         m_LabelImage;

            int             m_LeftOffset;       /*!< Détermine le décalage entre le canvas et le bord gauche de l'écran     */
            int             m_TopOffset;        /*!< Détermine le décalage entre le canvas et le bord supérieur de l'écran  */

            int             m_Width;            /*!< Largeur du canvas  */
            int             m_Height;           /*!< Hauteur du canvas  */

            float           m_Zoom;             /*!< Détermine la taille réelle de la zone d'affichage par rapport
                                                     à sa taille initiale et à la valeur de zoom  */

            bool            m_IsLastMoveEvent;  /*!< Détermine si la l'on est, ou non, dans la première occurence de mouseMove  */

            int             m_LastX;            /*!< Enregistre la position de la souris lors du dernier événement de type mouseMove*/
            int             m_LastY;

            float           m_ZoomMax;          /*!< Valeur maximale de zoom pour le Canvas */

            ToolBox*         m_ToolBox;

        /*********************************
         *          Signals
         *********************************/
        signals:

            /*! @brief  Signal connecté à la status bar de la main window   */
            void StatusChanged(QString);

            /*! @brief Ce signal sera executé lorsque l'utilisateur clique sur la zone d'affichage. La valeur transmise par
             *  le signal est la position, en x, y, ou ce situe le curseur, au sein de la QGraphicsScene, c'est à dire
             *  corrigé des valeurs de zoom et de décalage  */
            void CanvasClicked(int, int);

        /*********************************
         *          Slots
         *********************************/
        protected slots :

            /*! @brief Cette fonction transforme la valeur "val", comprise entre l'interval  [a;b] en val2, compris entre
             * [aa;bb]  */
        void fromAtoB(int val, int & val2, int a, int b, int aa, int bb);


        /*! @brief  Fonction utilisé pour s'assurer que la valeur de zoom ne dépasse pas un certain
         *          seuil   */
        void Zoom(float value);

};

#endif // CANVAS_H
